/**
 * 
 * 在ant-design中使用自定义异步路由规则时，
 * 为了在输入数据后，验证该数据是否已存在与数据库中
 * 主要优点：
 * 1.加入了防抖函数，使得每次输入数据不会立即发起网络请求，而是通过配置时间变量的方式控制时间间隔
 * 2.完整的封装了api,只对外暴露 callBack judgment
 * 3.调用例子：
 *     <Form.Item
            label="Username"
            name="username"
            rules={[
              {
                validator: judgment('http://127.0.0.1:3000', callBack, 1000) //判断输入的表名是否重复
              }
            ]}
          >
            <Input />
          </Form.Item>
 * */ 



// 防抖函数
const antiShake = (() => {

  let timer = null;
  return function (rules, value, url, callback, times) {
    console.log("antiShake");
    if (timer) {
      clearTimeout(timer)
    }
    return new Promise((resolve, reject) => {
      timer = setTimeout(() => {
        resolve(callback(url, rules, value))
      }, times)
    })

  }
})()

export const callBack = async (url, rule, value) => {

  // let url = 'http://127.0.0.1:3000'
  const response = await fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json;charset=utf-8'
    },
    body: JSON.stringify({ value })
  });
  // 返回一个promise对象,最终的结果需要使用 await或者then去接收
  return response.json();
}

export const judgment = (url, callBack, time) => {
  const fn = async (rule, value) => {
    let result = await antiShake(rule, value, url, callBack, time);
    // result -> 请求返回的结果
    console.log("result",result)
    return result.code === 200 ? Promise.resolve() : Promise.reject(new Error('请不要输入重复的表名'))
  }
  return fn

}


